#include <iostream>
#include <vector>
using namespace std;
// 大于等于value的最左位置
// int nearestIndex(vector<int>& a, int value) {
//     int L = 0;
//     int R = a.size() - 1;
//     int index = -1;
//     while(L <= R) {
//         int mid = L + ((R - L)>>1);
//         if(a[mid] >= value) {
//             index = mid;
//             R = mid - 1;
//         }else {
//             L = mid + 1;
//         }
//     }
//     return index;
// }
// 小于等于value的最右区间
// int nearestIndex(vector<int>& a, int value) {
//     int L = 0;
//     int R = a.size() - 1;
//     int index = -1;
//     while(L <= R) {
//         int mid = L + ((R - L)>>1);
//         if(a[mid] <= value) {
//             index = mid;
//             L = mid + 1;
//         }else {
//             R = mid - 1;
//         }
//     }
//     return index;
// }

////////////////////////////////////////////////////////////////////////
// 这里的是大于等于value的最左区间的值，*等于value*
int nearestIndex(vector<int>& a, int value) {
    if(a.size() == 0) {
        return -1;
    }
    int L = 0;
    int R = a.size() - 1;
    while(L < R) {
        int mid = L + ((R - L)>>1); // 我们这里是标准二分，也就是大于等于的情况
        if(a[mid] < value) {
            L = mid + 1;
        }else {
            R = mid;
        }
    }
    if(a[L] != value) {
        return -1;
    }
    return R; // 这里返回L和R都是可以的
}
// 这里的是小于等于value的最右位置，*值等于value*
// int nearestIndex(vector<int>& a, int value) {
//     if(a.size() == 0) {
//         return -1;
//     }
//     int L = 0;
//     int R = a.size() - 1;
//     while(L < R) {
//         int mid = L + ((R - L + 1)>>1); // 这里不是标准的二分，而是偏向右侧的二分，所以我们要向右偏来找到我们要求的小于等于value的最右位置
//         if(a[mid] <= value) {
//             L = mid;                        
//         }else {
//             R = mid - 1;
//         }
//     }
//     if(a[L] != value) {
//         return -1;
//     }
//     return R; // 这里返回L和R是一样的
// }

int main() {
    vector<int> a = {4, 5, 6, 6, 6, 10, 10, 12, 13};
    cout << nearestIndex(a, 6);
    return 0;
}